import java.util.Arrays;

/**
 * 插入排序
 * <p>
 * <p>
 * 与选择排序比较
 * <p>
 * 1. 二者平均时间复杂度都是 $O(n^2)$
 * <p>
 * 2. 大部分情况下，插入都略优于选择
 * <p>
 * 3. 有序集合插入的时间复杂度为 $O(n)$
 * <p>
 * 4. 插入属于稳定排序算法，而选择属于不稳定排序
 */
public class InsertSort {
    public static void main(String[] args) {
        int[] a = {7, 5, 19, 8, 4, 1};
        insert(a);
    }

    /**
     * 算法描述：
     * <p>
     * 1. 将数组分为两个区域，排序区域和未排序区域，每一轮从未排序区域中取出第一个元素，插入到排序区域（需保证顺序）
     * <p>
     * 2. 重复以上步骤，直到整个数组有序
     */
    // 修改了代码与希尔排序一致
    public static void insert(int[] a) {
        // i 代表待插入元素的索引
        for (int i = 1; i < a.length; i++) {
            int t = a[i]; // 代表待插入的元素值
            int j = i;
            System.out.println(j);
            while (j >= 1) {
                if (t < a[j - 1]) { // j-1 是上一个元素索引，如果 > t，后移
                    a[j] = a[j - 1];
                    j--;
                } else { // 如果 j-1 已经 <= t, 则 j 就是插入位置
                    break;
                }
            }
            a[j] = t;
            System.out.println(Arrays.toString(a) + " " + j);
        }
    }
}
